package com.torlesse.leetcode.algorithm.common;

/**
 * Created with IntelliJ IDEA.
 *
 * @Author: torlesse-liang
 * @Date: 2022/03/04/20:54
 * @Description: 冒泡算法
 */
public class BubbleSort {

    public static void main(String[] args) {
//        bubbleSort(Swap.array);
//        bubbleSort2(Swap.array);
        bubbleSort3(Swap.array);
        Swap.print(Swap.array);
    }

    /**
     * 冒泡算法
     */
    public static void bubbleSort(int[] array){
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1; j++) {
                //从小到大排序，最大元素先归位
                if(array[j] > array[j + 1]){
                    Swap.swap(array,j,j+1);
                }
            }
        }
    }

    /**
     * 冒泡算法改进
     * @param array
     */
    public static void bubbleSort2(int[] array){
        for (int i = 0; i < array.length - 1; i++) {
            // 改进地方, j < array.length - 1 - i 因为最大元素已经归位了
            for (int j = 0; j < array.length - 1 - i; j++) {
                //从小到大排序，最大元素先归位
                if(array[j] > array[j + 1]){
                    Swap.swap(array,j,j+1);
                }
            }
        }
    }

    /**
     * bubbleSort2 基础上进一步改进
     * 指针的思想解决问题，上述例子是左边元素归位，现在是两头同时归位
     * @param array
     */
    public static void bubbleSort3(int[] array){
        int left = 0;
        int right = array.length - 1;

        while(left < right){
            //最大元素归位
            for (int i = left; i < right; i++){
                if(array[i] > array[i + 1]){
                    Swap.swap(array,i+1,i);
                }
            }
            right --;
            //最小元素归位
            for (int i = right; i > left; i--) {
                if(array[i] < array[i - 1]){
                    Swap.swap(array,i,i-1);
                }
            }
            left ++;
        }
    }
}
